package com.nb.hdj.util;

import com.nb.hdj.baseClass.CreateDriverBase;
import io.qameta.allure.Attachment;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

import java.net.MalformedURLException;

/**
 * @Description: 截图监听器
 * @Author: hedongjia
 * @Date: 2021/11/10 上午10:53
 * @Version: v1.0
 */
public class TestngListener extends TestListenerAdapter {
    private static final Logger logger = LoggerFactory.getLogger(TestngListener.class);
    /**
     * 那就是在第一步设定重跑次数的时候，没有设定什么时候把正在重跑的次数（currentCount）还原为初始值，
     * 这样就会导致只有在执行第一个失败用例的时候会进行重跑，遇到第二个失败用例，因为当前的运行次数已经超过最大次数了，
     * 但是并没有进行还原，所以后面的失败用例永远不会进入重跑。
     * @param tr
     */
    @Override
    public void onTestFailure(ITestResult tr) {
        //如果测试用例执行完所有重试以后依然失败的话，重新设置currentCount为初始值，方便其他用例执行重试
        super.onTestFailure(tr);
        BaseTest bt = (BaseTest) tr.getInstance();
        WebDriver driver = bt.getDriver();
        takePhoto(driver);
        logCaseStep(tr);
        exceptedResult(tr);
        TestCaseRetry.currentCount = 1;
        logger.error("当前测试方法【" + tr.getName() + "】全部重试执行失败,重试机制的次数恢复初始值,并将错误截图到测试报告中!");
    }

    /**
     *
     * @param tr
     */
    @Override
    public void onTestSuccess(ITestResult tr) {
        //如果测试用例执行重试的时候，执行成功了，也需要设置currentCount为初始值，方便其他用例执行重试
        logger.info("当前测试方法【" + tr.getName() + "】执行成功,重试机制的次数恢复初始值!");
        TestCaseRetry.currentCount = 1;
        super.onTestSuccess(tr);
    }

    /**
     * 使用Allure的@Attachment注解就可以在测试报告里添加附件了，这里添加了截图、测试步骤和期望结果
     * @param driver
     * @return
     */
    @Attachment(value = "失败截图如下：",type = "image/png")
    public byte[] takePhoto(WebDriver driver) {
        byte[] screenshotAs = ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
        return screenshotAs;
    }

    /**
     * 打印测试步骤
     * @param tr
     */
    @Attachment(value = "操作步骤如下：")
    public String logCaseStep(ITestResult tr){
        String step = "1、打开浏览器  2、输入百度地址";
        return step;
    }

    /**
     * 打印测试步骤
     * @param tr
     */
    @Attachment(value = "期望结果如下：")
    public String exceptedResult(ITestResult tr){
        String result = "显示查询结果";
        return result;
    }

}
